0 REM << RR54-1 >> 1 REM=================================== 2 REM 3 REM DIRECTORY SCANNER 4 REM 5 REM RUPERT REPORT #54 6 REM 7 REM==== C-64/128 ==== 1541/1571 ====== 8 PRINT"" 10 REM 20 REM READ AND DISPLAY DIRECTORY 30 REM USING DOS DIRECT ACCESS COMMANDS 40 REM 100 GOSUB 1000 :REM INITIALIZE 110 OPEN 15,DVC,15 :REM COMMAND CHANNEL 120 GOSUB 7000 :REM CHECK DISK STATUS 130 :REM OPEN DATA CHANNEL 2; SET UP A DISK BUFFER FOR IT 140 OPEN 1,DVC,2,"#" 150 GOSUB 7000 :REM CHECK DISK STATUS 160 :REM -- READ SECTOR INTO CHANNEL 2'S BUFFER IN DISK DRIVE : 170 PRINT# 15,RD$;2;DVC;TK;SC 180 GOSUB 7000 :REM CHECK DISK STATUS 190 GOSUB 2000 :REM READ DISK BUFFER INTO COMPUTER 200 :REM -- INTERPRET DATA BYTES -- 210 FOR FIL=0 TO 7 220 GOSUB 3000 :REM DISPLAY DIR ENTRIES 230 REM >>> GOSUB 5000 :REM SELECT UNDELETION 240 NEXT FIL 250 PRINT L$ 260 REM >>>> IF UDFLG THEN GOTO 6000:REM UNDELETE & END 270 GOSUB 4000 :REM CONTINUE OR END? 280 GOTO 170 :REM CONTINUE 290 REM -------------------------------- 1000 REM ======== INITIALIZE ========= 1010 PRINT CHR$(147); "==DIRECTORY SCANNER==": PRINT 1020 FALSE=0: TRUE=NOT FALSE: Z$=CHR$(0) 1030 NUL$=Z$: SP$=" ": L$="--" 1040 FOR N=1 TO 4: NUL$=NUL$+NUL$: SP$=SP$+SP$: L$=L$+L$: NEXT 1050 SP$="[145] " + SP$ + " [145]" 1060 FOR N=0 TO 4: READ TYP$(N): NEXT N 1070 DATA DEL, SEQ, PRG, USR, REL 1080 RD$="U1": WR$="U2" 1090 TK=18: SC=1 :REM 1ST DIR TRK/SECTOR 1100 DVC=8 1110 RETURN 1120 REM ------------------------------- 2000 REM ======== READ SECTOR ========= 2010 B$="" 2020 PRINT "READING TRACK, SECTOR :"; TK; SC 2030 PRINT "=================================" 2040 PRINT "FILE NAME.......TYPE: TK SC LEN" 2050 PRINT "=================================" 2060 PRINT# 15,"B-P";2;0 :REM POINT TO BYTE 0 OF CHNL 2 BUFFER 2065 :REM GET NEXT DIR TRACK & SECTOR 2070 GET# 1,TK$: IF TK$="" THEN TK$=Z$ 2080 GET# 1,SC$: IF SC$="" THEN SC$=Z$ 2090 FOR N=2 TO 255 2100 GET# 1,D$ 2110 IF D$="" THEN D$=Z$ 2120 B$=B$+D$ :REM READ BUFFER INTO B$ 2130 NEXT N 2140 RETURN 2150 REM ------------------------------- 3000 REM ======= INTERPRET DATA ====== 3010 PTR=FIL*32+1 3020 FF=ASC(MID$(B$,PTR,1)) :REM FILE STATUS 3030 MD=FF AND 192 :REM CLOSURE MODE 3040 TYP=FF AND 7 :REM FILE TYPE 3050 :REM -- FIRST TK & SECTOR OF FILE 3060 FTK=ASC(MID$(B$,PTR+1,1)) 3070 FSC=ASC(MID$(B$,PTR+2,1)) 3080 NM$=MID$(B$,PTR+3,16) :REM FILENAME 3090 NULFLG=FALSE: IF NM$=NUL$ THEN NM$="( UNUSED ENTRY )": NULFLG=TRUE 3100 BLK=ASC(MID$(B$,PTR+28,1))+ASC(MID$(B$,PTR+29,1))*256 :REM FILE LENGTH 3110 PRINT NM$;: IF NULFLG THEN PRINT: GOTO 3130 3120 PRINT ","; TYP$(TYP); ": "; FTK; FSC; BLK 3130 IF MD=192 THEN PRINT " ( FILE LOCKED )" 3140 IF MD=0 AND TYP>0 THEN PRINT "> FILE NOT PROPERLY CLOSED <" 3150 RETURN 3160 REM ------------------------------- 4000 REM ======= CONTINUE ============ 4010 PRINT: PRINT "Q TO QUIT; ANY OTHER KEY TO CONTINUE" 4020 GET K$: IF K$>"" THEN 4020 :REM EMPTY KYBD BUFFER 4030 GET K$: IF K$="" THEN 4030 4040 PRINT SP$ 4050 IF K$="Q" THEN 4100 4060 REM -- NEXT TRACK & SECTOR OF DIR : 4070 TK=ASC(TK$+Z$): SC=ASC(SC$+Z$) 4080 IF TK=18 THEN GOTO 4110 4090 PRINT "NO MORE FILES IN DIRECTORY" 4100 CLOSE 1: CLOSE 15: END 4110 RETURN 4120 REM ------------------------------- 5000 REM ==== SELECT FOR UNDELETION ==== 5010 IF TYP>0 OR NULFLG THEN 5100 5020 PRINT " PRESS U TO UNDELETE THIS FILE[146]" 5030 GET K$: IF K$>"" THEN 5030: REM CLEAR KYBD 5040 GET K$: IF K$="" THEN 5040 5050 PRINT SP$:IF K$<>"U" THEN GOTO 5100 5060 UDFLG=TRUE : CT=CT+1 5070 PRINT "[145]"; TAB(35); "*" 5080 PRINT " (- TO BE UNDELETED -)" 5090 B$=LEFT$(B$,PTR-1)+CHR$(128+2)+MID$(B$,PTR+1) 5100 RETURN 5110 REM ------------------------------- 6000 REM ========= UNDELETE ============ 6010 PRINT# 15,"B-P";2;0 6020 PRINT# 1,TK$;SC$;B$; 6030 GOSUB 7000 6040 PRINT# 15,WR$;2;DVC;TK;SC 6050 GOSUB 7000 6060 PRINT# 15,"V0" :REM VALIDATE 6070 PRINT "VALIDATING DISK..." 6080 GOSUB 7000 6090 PRINT CT; "FILE(S) UNDELETED" 6100 CLOSE 1: CLOSE 15: END 6110 REM ------------------------------- 7000 REM ====== CHECK DISK STATUS ==== 7010 IF DS$="" THEN GOTO 7050 :REM (FOR C-64 ONLY) 7020 IF DS<20 THEN RETURN 7030 PRINT "DISK ERROR :"; DS$ : CLOSE 1: CLOSE 15: END 7040 REM === C-64 ONLY === 7050 INPUT# 15,EN,EM$,ET,ES 7060 IF EN<20 THEN RETURN 7070 PRINT "DISK ERROR :"; EN;EM$;ET;ES 7080 CLOSE 1: CLOSE 15: END 7090 REM -------------------------------